import axios from 'axios'
import { ElMessage, ElMessageBox } from 'element-plus'
import Indicator from '@/base/Indicators.js'
import ClientJs from '@/base/clientjs'

const nlAxios = axios

nlAxios.defaults.transformResponse = [(data) => {
    return data
}]

nlAxios.defaults.timeout = 120000 // 默认120秒
const RETRY = 0 // 超时默认再请求一次
const RTRY_DELAY = 1000 // 超时后的请求间隙

// 请求拦截器
nlAxios.interceptors.request.use(
    config => {
        if (config.__retryCount > 0) { // 重试机制触发的请求
            return config
        }

        let method = config.method

        if (method == 'get') {
            if (config.data == void 0) {
                config.data = {}
            }
            if (!config.unLoadFlg) {
                Indicator.open()
            }
        } else {
            if (!config.data || !config.data.unLoadFlg) {
                Indicator.open()
            }
        }

        return config
    },
    err => {
        return Promise.reject(err)
    }
)

// http响应拦截器
nlAxios.interceptors.response.use(res => {
    let url = res.config.url
    let configData = res.config.data

    if (~url.indexOf('/preTelEnterNet/h5getPaperlessStatus')
        || ~url.indexOf('/preTelEnterNet/h5PreTelCommitNew')
        || res.config.unLoadFlg
        || (configData && (configData.unLoadFlg || ~configData.indexOf('unLoadFlg')))) {
        // 不需要关闭加载圈
    } else {
        Indicator.close() // 响应成功关闭loading
    }

    // 鉴权失败状态码9999
    if (res.data.retCode == '9999') {
        let msg = res.data.retMsg || '会话已失效请重新登录'
        ElMessageBox.alert({ title: '温馨提示', message: msg })
            .then(() => {
                // 请求客户端重新登录
                ClientJs.autologinInterface('refreshUserInfo')
            }).catch(() => { })
    }
    return res
}, error => {
    Indicator.close()

    // 获取状态码
    const status = (error.response && error.response.status) || ''
    const data = (error.response && error.response.data) || {}

    if (data.message) {
        ElMessage(data.message)
        return Promise.reject(data.message)
    }

    if (error.code == 'ECONNABORTED' && error.message.indexOf('timeout') != -1) {
        return reqTimeOutRetry(error.config)
    }

    return Promise.reject('未知错误:' + url + ' 状态：' + status)
})

// 请求超时重试机制
function reqTimeOutRetry(config) {
    if (RETRY == 0) { // 不设置重新请求
        return Promise.reject('请求超时,' + config.url)
    }

    config.__retryCount = config.__retryCount || 0

    if (config.__retryCount >= RETRY) {
        return Promise.reject('请求超时,' + config.url)
    }
    config.__retryCount += 1

    var backoff = new Promise(function (resolve) {
        setTimeout(function () {
            resolve()
        }, RTRY_DELAY || 1)
    })

    return backoff.then(function () {
        return axios(config)
    })
}

export default nlAxios


